<?php

/*
 * @author bachi@taobao.com
 * @info https://gist.github.com/2485984
 *
 * @useage 
 * 		url/combine.php?file1.js,file2.js?t={$date}
 * 		url/combine.php?file1.js&file2.js&t=100
 * @more
 * 		http://jayli.github.com
 *
 * */
 
//得到扩展名
function get_extend($file_name) { 
	$extend =explode("." , $file_name);
	$va=count($extend)-1;
	return $extend[$va];
} 
 
/**
 * begin
 */
//cdn上存在的各种可能的文件类型
$header = array(
    'js' => 'Content-Type: application/x-javascript',
    'css' => 'Content-Type: text/css',
    'jpg' => 'Content-Type: image/jpg',
    'gif' => 'Content-Type: image/gif',    
    'png' => 'Content-Type: image/png',
    'jpeg' => 'Content-Type: image/jpeg',
    'swf' => 'Content-Type: application/x-shockwave-flash'
);
 
//文件类型
$type = '';
 
//原始请求文件完整路径数组
$files = array();
 
//原始请求文件相对路径数组
$tmp_files = array();

//过滤后的文件完整路径数组，即待抓取的文件列表
$a_files = array();

//文件的最后修改时间
$last_modified_time = 0;

//获得当前目录，比如，/home/a.tbcdn.cn/
$pwd = getcwd().'/';

// request headers
$request_headers = getallheaders(); 

// 输出结果使用的数组
$R_files = array();
 
//得到请求的前缀
$prefix = $_SERVER['SCRIPT_NAME'];

// 处理请求中附带的文件列表，得到原始数据
$split_a= explode("?",$_SERVER['REQUEST_URI']);
$split_a=str_replace("&",",",$split_a);
$tmp_files = explode(",",$split_a[1]);

// 得到拼接文件的Last-Modified时间
foreach ($tmp_files as $k){
	if(file_exists($k)){
		$filemtime = filemtime($k);
		if($filemtime && ($filemtime > $last_modified_time)){
			$last_modified_time = $filemtime;
		}
	}
}

// 检查请求头的if-modified-since，判断是否304
if (isset($request_headers['If-Modified-Since']) && (strtotime($request_headers['If-Modified-Since']) == $last_modified_time)) {
	// 如果客户端带有缓存
	header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_modified_time.' GMT'), true, 304);
	exit;
} 

// 拼接文件，并应用通用规则
foreach ($tmp_files as $k) {

    if(empty($type)) {
		$type = get_extend($k);
    }
 
    //文件存在
    if(file_exists($k)) {
		$R_files[] = file_get_contents($k);
    }else{
		//文件不存在
		try{
			//php4不支持try catch，如果基于php4的话，删掉try catch语句
			$R_files[] = '/***** file not found: '.$k.' *****/';
		}catch(Exception $e){}
    }
}
 
//添加过期头，过期时间1年
header("Expires: " . date("D, j M Y H:i:s", strtotime("now + 10 years")) ." GMT");
header("Cache-Control: max-age=315360000");
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_modified_time).' GMT');
//输出文件类型
header($header[$type]);
//拼装文件
$result = join("\n",$R_files);
//输出文件
echo $result;
?>

